package br.com.bankai.koby.presentation.controller;

import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.bankai.koby.repository.entity.Usuario;
import br.com.bankai.koby.service.exception.NoResultFoundException;
import br.com.bankai.koby.service.exception.PinRegisteredException;
import br.com.bankai.koby.service.exception.UserAuthenticationException;
import br.com.bankai.koby.service.impl.UsuarioService;
import br.com.graflogic.utilities.presentationutil.controller.BaseController;

/**
 * 
 * @author Guilherme
 * 
 */
@Controller
@Scope("view")
public class PrimeiroAcessoController extends BaseController {

	private static final long serialVersionUID = -5590227834507530295L;

	private static final String HOME_PAGE = "/pages/home.jsf";

	@Autowired
	private UsuarioService usuarioService;
	private String cpf;
	private String senha;
	private String novaSenha;
	private Usuario usuario;

	public void autentica() {
		try {
			usuario = null;
			cpf = cpf.replaceAll("[- .]", "");
			usuario = usuarioService.autentica(cpf, senha);
		} catch (NoResultFoundException e) {
			returnWarnMessage("Usuário não encontrado", null, null);
		} catch (UserAuthenticationException e) {
			returnWarnMessage("Autenticação inválida", null, null);
		} catch (PinRegisteredException e) {
			returnWarnMessage("Primeiro acesso já realizado", null, null);
		} catch (Throwable t) {
			returnFatalMessage("Erro ao autenticar o usuário, contate o administrador", null, t);
		}
	}

	public void primeiroAcesso() {
		try {
			usuarioService.primeiroAcesso(usuario.getId(), novaSenha);
			FacesContext context = FacesContext.getCurrentInstance();
			String target = context.getExternalContext().getRequestContextPath() + HOME_PAGE;
			returnInfoMessage("Primeiro acesso realizado com sucesso", target);
			usuario = null;
		} catch (Throwable t) {
			returnFatalMessage("Erro ao realizar o primeiro acesso, contate o administrador", null, t);
		}
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getNovaSenha() {
		return novaSenha;
	}

	public void setNovaSenha(String novaSenha) {
		this.novaSenha = novaSenha;
	}
}